#ifdef SU1
#define _GLIBCXX_DEBUG
#endif

#include <algorithm>
#include <bitset>
#include <cassert>
#include <climits>
#include <cstring>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <stack>
#include <set>
#include <string>
#include <utility>
#include <vector>

using namespace std;

#define forn(i, n) for (int i = 0; i < int(n); i++)
#define forl(i, n) for (int i = 1; i <= int(n); i++)
#define ford(i, n) for (int i = int(n) - 1; i >= 0; i--)
#define fore(i, l, r) for (int i = int(l); i <= int(r); i++)
#define pb(a) push_back(a)
#define mp(x, y) make_pair((x), (y))
#define sz(a) (int) (a).size()
#define all(a) (a).begin(), (a).end()
#define ft first
#define sc second
#define x first
#define y second

template<typename X> inline X abs(const X& a) { return a < 0 ? -a : a; }
template<typename X> inline X sqr(const X& a) { return a * a; }

typedef long long li;
typedef long double ld;
typedef pair<int, int> pt;

const int INF = int(1e9);
const li INF64 = li(1e18);
const ld PI = acosl(ld(-1));
const ld EPS = 1e-9;

const int N = 4000 + 3;

int n;
vector<int> neib[N];
int match[N];
vector<int> g[N], tg[N];

inline bool read()
{
	if (scanf("%d", &n) != 1) return false;
	forn(i, n)
	{
		int cnt;
		assert(scanf("%d", &cnt) == 1);
		neib[i].resize(cnt);
		forn(j, sz(neib[i])) assert(scanf("%d", &neib[i][j]) == 1), neib[i][j]--;
	}
	forn(i, n) assert(scanf("%d", &match[i]) == 1), match[i]--;
	return true;
}

vector<int> perm;
int used[N];
int c[N], C;

void dfs (int v)
{
	used[v] = true;
	
	forn(i, sz(g[v]))
		if (!used[g[v][i]])
			dfs(g[v][i]);
			
	perm.pb(v);
}

void css (int v)
{
	c[v] = C;
	forn(i, sz(tg[v]))
		if (c[tg[v][i]] == -1)
			css(tg[v][i]);
}

inline void solve()
{
	forn(i, n) forn(j, sz(neib[i]))
		if (neib[i][j] == match[i])
		{
			g[i].pb(n + neib[i][j]);
			tg[n + neib[i][j]].pb(i);
		}
		else
		{
			g[n + neib[i][j]].pb(i);
			tg[i].pb(n + neib[i][j]);
		}
			
	forn(i, 2 * n) if (!used[i]) dfs(i);
	assert(sz(perm) == 2 * n);
	reverse(all(perm));
	forn(i, 2 * n) c[i] = -1;
	forn(i, 2 * n) if (c[perm[i]] == -1) css(perm[i]), C++;
	
	forn(i, n)
	{
		vector<int> ans;
		forn(j, sz(neib[i]))
		{
			int to = neib[i][j] + n;
			if (match[i] == neib[i][j] || c[i] == c[to])
				ans.pb(neib[i][j]);
		}
		printf("%d", sz(ans));
		forn(j, sz(ans)) printf(" %d", ans[j] + 1);
		puts("");
	}
}

int main()
{
#ifdef SU1
	assert(freopen("input.txt", "rt", stdin));
//	assert(freopen("output.txt", "wt", stdout));
#endif

	cout << fixed << setprecision(10);
	cerr << fixed << setprecision(5);

	assert(read());
	solve();
	
#ifdef SU1
	cerr << "=== TIME : " << clock() << " ===" << endl;
#endif
	return 0;
}
